// MIR for `main` before ElaborateDrops

fn main() -> () {
    let mut _0: ();                      // return place in scope 0 at $DIR/box_expr.rs:+0:11: +0:11
    let _1: std::boxed::Box<S>;          // in scope 0 at $DIR/box_expr.rs:+1:9: +1:10
    let mut _2: usize;                   // in scope 0 at $DIR/box_expr.rs:+2:5: +2:23
    let mut _3: usize;                   // in scope 0 at $DIR/box_expr.rs:+2:5: +2:23
    let mut _4: *mut u8;                 // in scope 0 at $DIR/box_expr.rs:+2:5: +2:23
    let mut _5: std::boxed::Box<S>;      // in scope 0 at $DIR/box_expr.rs:+2:5: +2:23
    let _6: ();                          // in scope 0 at $DIR/box_expr.rs:+3:5: +3:12
    let mut _7: std::boxed::Box<S>;      // in scope 0 at $DIR/box_expr.rs:+3:10: +3:11
    scope 1 {
        debug x => _1;                   // in scope 1 at $DIR/box_expr.rs:+1:9: +1:10
    }
    scope 2 {
    }

    bb0: {
        StorageLive(_1);                 // scope 0 at $DIR/box_expr.rs:+1:9: +1:10
        _2 = SizeOf(S);                  // scope 2 at $DIR/box_expr.rs:+2:5: +2:23
        _3 = AlignOf(S);                 // scope 2 at $DIR/box_expr.rs:+2:5: +2:23
        _4 = alloc::alloc::exchange_malloc(move _2, move _3) -> bb1; // scope 2 at $DIR/box_expr.rs:+2:5: +2:23
                                         // mir::Constant
                                         // + span: $DIR/box_expr.rs:8:5: 8:23
                                         // + literal: Const { ty: unsafe fn(usize, usize) -> *mut u8 {alloc::alloc::exchange_malloc}, val: Value(<ZST>) }
    }

    bb1: {
        StorageLive(_5);                 // scope 0 at $DIR/box_expr.rs:+2:5: +2:23
        _5 = ShallowInitBox(move _4, S); // scope 0 at $DIR/box_expr.rs:+2:5: +2:23
        (*_5) = S::new() -> [return: bb2, unwind: bb8]; // scope 0 at $DIR/box_expr.rs:+2:14: +2:22
                                         // mir::Constant
                                         // + span: $DIR/box_expr.rs:8:14: 8:20
                                         // + literal: Const { ty: fn() -> S {S::new}, val: Value(<ZST>) }
    }

    bb2: {
        _1 = move _5;                    // scope 0 at $DIR/box_expr.rs:+2:5: +2:23
        drop(_5) -> bb3;                 // scope 0 at $DIR/box_expr.rs:+2:22: +2:23
    }

    bb3: {
        StorageDead(_5);                 // scope 0 at $DIR/box_expr.rs:+2:22: +2:23
        StorageLive(_6);                 // scope 1 at $DIR/box_expr.rs:+3:5: +3:12
        StorageLive(_7);                 // scope 1 at $DIR/box_expr.rs:+3:10: +3:11
        _7 = move _1;                    // scope 1 at $DIR/box_expr.rs:+3:10: +3:11
        _6 = std::mem::drop::<Box<S>>(move _7) -> [return: bb4, unwind: bb6]; // scope 1 at $DIR/box_expr.rs:+3:5: +3:12
                                         // mir::Constant
                                         // + span: $DIR/box_expr.rs:9:5: 9:9
                                         // + literal: Const { ty: fn(Box<S>) {std::mem::drop::<Box<S>>}, val: Value(<ZST>) }
    }

    bb4: {
        StorageDead(_7);                 // scope 1 at $DIR/box_expr.rs:+3:11: +3:12
        StorageDead(_6);                 // scope 1 at $DIR/box_expr.rs:+3:12: +3:13
        _0 = const ();                   // scope 0 at $DIR/box_expr.rs:+0:11: +4:2
        drop(_1) -> bb5;                 // scope 0 at $DIR/box_expr.rs:+4:1: +4:2
    }

    bb5: {
        StorageDead(_1);                 // scope 0 at $DIR/box_expr.rs:+4:1: +4:2
        return;                          // scope 0 at $DIR/box_expr.rs:+4:2: +4:2
    }

    bb6 (cleanup): {
        drop(_7) -> [return: bb7, unwind terminate]; // scope 1 at $DIR/box_expr.rs:+3:11: +3:12
    }

    bb7 (cleanup): {
        drop(_1) -> [return: bb9, unwind terminate]; // scope 0 at $DIR/box_expr.rs:+4:1: +4:2
    }

    bb8 (cleanup): {
        drop(_5) -> [return: bb9, unwind terminate]; // scope 0 at $DIR/box_expr.rs:+2:22: +2:23
    }

    bb9 (cleanup): {
        resume;                          // scope 0 at $DIR/box_expr.rs:+0:1: +4:2
    }
}
